package sockets;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JTextArea;


/*
 * @author Danilo
 * @author Julio
 */
 
public class ServidorTCP extends Thread{
    static ArrayList<Item> lista;
    // Variavel responsavel por determinar a porta de comunicação com o cliente.
    protected int portaTCP= 6006;
    protected int contador;
    boolean aux;
    static String mensagem;
    

    
    boolean eMensagem = false;
    int tamList;
    static ArrayList<String> mList = new ArrayList<String>();
            
    
    // Variavel responsável por mostrar na tela as mensagens de comunicação com o servidor.
    protected JTextArea servidorOut;
    public ServidorTCP(JTextArea saida){
         servidorOut = saida;
         aux = false;
         contador = 0;
    }

    @Override
    public void run(){
        
        // Cria um socket que espera uma solicitação de comunicação do clienteTCP.
        ServerSocket socketServidor = null;
        
        // Cria um socket para realizar a comunicação com o clienteTCP
        Socket socket2 = null;

        try{
            // Cria um socket de acordo com a porta inserida para a comunicação entre ele e o clienteTCP.
            socketServidor = new ServerSocket(portaTCP);
            //socketServidor.setSoTimeout(2000);
        } catch(Exception e){
            System.err.println(e);
        }
        
               
          try
            {   
                System.out.println("No servidor!!!!");
                socket2 = socketServidor.accept();
                
                
                // Cria uma variável que recebe o endereço de conexão com o clienteTCP.
                InetAddress address = socket2.getInetAddress();
                
                // Mostra na tela que a conexão TCP foi reazliada a partir da porta inserida.
                servidorOut.append("Conexão TCP realizada. \nPorta:" + portaTCP + " \n");
                
                // Mostra na tela que a conexão TCP foi realizada a partir do endereço inserido.
                servidorOut.append("Endereço de origem TCP: " + address + "\n");
                
                // Utilizada para enviar mensagem de saida para o socket do servidorTCP.
                DataOutputStream ostream = new DataOutputStream(socket2.getOutputStream());
                
                // Utilizada para receber a mensagem de resposta do servidorTCP.
                DataInputStream istream = new DataInputStream(socket2.getInputStream());
                
                mensagem = istream.readUTF();
                tamList = mList.size();
                
                //Verifica se a mensagem já esta na lista
                for(int i = 0; i < tamList; i++){
                    if(mList.get(i).equals(mensagem)){
                        eMensagem = true;
                    }
                
                }
                
                //Adiciona a mensagem na lista, caso ela seja nova
                if(!eMensagem){
                    mList.add(mensagem);
                    System.out.println("Tah vendo, atualizou!");
                    Gossip executa = new Gossip();
                    executa.enviaNovo(mensagem);
                    
                }
                System.out.println(mList);
                
                
                // Mostra na tela a mensagem que o servidoTCP recebeu do cliente.
                servidorOut.append("Servidor TCP recebeu: " + mensagem + " \n"+"____________________________________\n");
                // Retorna um ACK para o clienteTCP e fecha o socket
                ostream.writeUTF("ACK!\n");
                ostream.flush();
                
                
            } catch(Exception e){
                try {
                    System.out.println("No servidor2!!!!");
                    servidorOut.append("Servidor: Impossivel conectar no momento\n"+"_________________________________\n\n");  
                    socket2.close();
                } catch (IOException ex) {
                    Logger.getLogger(ServidorTCP.class.getName()).log(Level.SEVERE, null, ex);
                }
            } finally{ 
                    System.out.println("No servidor3!!!!");  
                try {
                    socket2.close();
                } catch (IOException ex) {
                    Logger.getLogger(ServidorTCP.class.getName()).log(Level.SEVERE, null, ex);
                }
          }
        
    }
 }